package com.hb.A_基础.C_面向表达式编程

/**
 * Kotlin中的流程控制不再是清一色的普通语句，他们可以返回值，是一些崭新的表达式语句，如
 * if表达式、when表达式、try表达式等。这样的设计自然与表达式自身的特质相关。
 *
 * 表达式和语句的区别：
 *  表达式可以是一个值、常量、变量、操作符、函数、或他们之间的组合，编程语言对其进行解释和计算
 *  以求产生另一个值。通俗的说，表达式可以是返回值的语句。
 */
fun main() {
    ifExpression(true)
}

//Kotlin的版本的if表达式
/**
 * 1. 表达式让代码变得更加紧凑。我们可以把赋值语句与if表达式混合使用，就不存在变量a没有初始值的情况
 * 2. 在if做为表达式的时候，else分支也必须被考虑，这很容易理解，因为表达式具备类型信息，最终他的类型就是
 * if、else多个分支类型的相同类型或公共类型
 *
 */
fun ifExpression(flag:Boolean){
    val a =if (flag) "flag==true" else "flag==false"
    println(a.toUpperCase())
}

/**
 * Unit类型：让函数调用皆为表达式
 * 之所以不能说Java中的函数调用皆是表达式，是因为存在特例void.众所周知，在java中如果声明的含糊没有返回值
 * 那么他就需要用void来修饰。
 *
        void foo(){
        System.out.println("return nothing")
        }
 *  所以foo()就不具有值和类型的信息，他就不能算作一个表达式。同时，这与函数式语言的函数概念也存在
 *  冲突，在kotlin、scala这些语言中，函数在所有的情况下都具有返回类型，所以他们引入了Unit来替代Java中的
 *  void关键字。
 *
 *  如何理解Unit?其实它与int一样，都是一种类型，然而他不代表人格信息，用面向对象的术语来描述
 *  就是一个单例，他的实例只有一个。可写为（）。
 *
 *  Kotlin为什么Unit?一个很大的原因就是函数式编程侧重于组合，尤其是很多高阶函数，在源码的实现
 *  的时候都是采用泛型类实现的。然而使用void在设计泛型的情况下会存在问题。
 *  */





